AWS CloudShell 環境に GitHub CLI を導入する
こんにちは、製造ビジネステクノロジー部の若槻です。
AWS CloudShell を利用すると、AWS マネジメントコンソールからアクセスできるブラウザベースのターミナルを使用して、AWS CLI などの各種コマンドを実行することができます。
新規利用開始が終了となった AWS Cloud9 の移行先として、ハンズオン環境などに CloudShell の採用を検討される方も多いのではないでしょうか。
今回は、そんな AWS CloudShell 環境に GitHub CLI を導入する機会があったので、方法を確認してみました。
GitHub CLI とは
Git を利用した開発時に作業内容のコミットやプッシュなどを行うためには Git の git
コマンドを利用すると思いますが、それに加えて GitHub CLI の gh
コマンドを利用することで、GitHub の機能をコマンドラインから利用することができます。
GitHub CLI を使うと GitHub 上のリポジトリや Issue、プルリクエストなどを操作することができて便利ですが、このツールを使うべき最も大きな理由はブラウザベースでの認証により取得したトークンを gh
および git
コマンドで利用できる点にあります。git
コマンドのみの場合は予め作成した Personal Access Token や SSH キーを使用する必要がありセキュリティ上のリスクや煩雑さがありますが、GitHub CLI を使用すると gh auth login
実行時のインタラクティブな操作のみでトークンの取得とセットを行うことができます。
この GitHub CLI をせっかくなので CloudShell 環境でも利用可能としたいですね。
やってみた
CloudShell へのアクセス
何はともあれまずはマネジメントコンソールから CloudShell にアクセスします。
ちなみに CloudShell 自体の利用に料金は掛かりません。
GitHub CLI のインストール
CloudShell 環境には git コマンドはインストール済みですが、GitHub CLI はインストールされていません。
$ git --version
git version 2.40.1
$ gh --version
bash: gh: command not found
OS は Amazon Linux 2023 となっています。
$ uname -r
6.1.115-126.197.amzn2023.x86_64
GitHub CLI のインストール手順を確認してみると、Amazon Linux 2023 の手順はなく、Amazon Linux 2 の手順はあったので、それを試してみます。
手順に沿ってコマンドを実行していきます。
type -p yum-config-manager >/dev/null || sudo yum install yum-utils
sudo yum-config-manager --add-repo https://cli.github.com/packages/rpm/gh-cli.repo
sudo yum install gh
GitHub CLI をインストールできたようです。
$ gh --version
gh version 2.63.2 (2024-12-05)
https://github.com/cli/cli/releases/tag/v2.63.2
参考
GitHub CLI のログイン
GitHub CLI のログインは gh auth login コマンドにより行います。前述の通りこれにより取得およびセットされたトークンは gh
および git
コマンドで利用可能となります。
それではコマンドを実行してログインを試してみます。
しかし How would you like to authenticate GitHub CLI で Login with a web browser を選択してブラウザによる認証を行おうとすると認証が失敗しました。CloudShell からブラウザ画面を開けなかったようです。ローカル環境などの場合はすんなり開くのですが。
$ gh auth login
? Where do you use GitHub? GitHub.com
? What is your preferred protocol for Git operations on this host? HTTPS
? Authenticate Git with your GitHub credentials? Yes
? How would you like to authenticate GitHub CLI? Login with a web browser
! First copy your one-time code: 24C0-5D82
Press Enter to open https://github.com/login/device in your browser...
! Failed opening a web browser at https://github.com/login/device
exec: "xdg-open,x-www-browser,www-browser,wslview": executable file not found in $PATH
Please try entering the URL in your browser manually
そこで、URL https://github.com/login/device を直接ブラウザで開いて、ターミナル上に表示されたコードを入力します。
CloudShell のターミナルに戻ると、認証に成功したようです。
! First copy your one-time code: 24C0-5D82
Press Enter to open https://github.com/login/device in your browser...
! Failed opening a web browser at https://github.com/login/device
exec: "xdg-open,x-www-browser,www-browser,wslview": executable file not found in $PATH
Please try entering the URL in your browser manually
✓ Authentication complete.
- gh config set -h github.com git_protocol https
✓ Configured git protocol
! Authentication credentials saved in plain text
✓ Logged in as cm-rwakatsuki
gh コマンドでリポジトリをクローンしてみる
GitHub CLI の認証もできたことなので、認証が必要な操作としてプライベートな GitHub リポジトリをクローンしてみます。
gh repo clone コマンドを使用すると、上手くクローンできました。
$ gh repo clone classmethod-internal/icasu-cdk-serverless-api-sample
Cloning into 'icasu-cdk-serverless-api-sample'...
remote: Enumerating objects: 4407, done.
remote: Counting objects: 100% (1189/1189), done.
remote: Compressing objects: 100% (728/728), done.
remote: Total 4407 (delta 568), reused 725 (delta 443), pack-reused 3218 (from 1)
Receiving objects: 100% (4407/4407), 3.46 MiB | 16.57 MiB/s, done.
Resolving deltas: 100% (2420/2420), done.
$ ls
icasu-cdk-serverless-api-sample
$ cd icasu-cdk-serverless-api-sample/
$ ls
cspell.json docs package.json package-lock.json packages README.md tsconfig.json
git コマンドでコミット、プッシュしてみる
Git の基本ではあるのですが、Git を使い始める際に git config
コマンドで開発者の情報を設定する必要があります。
例えば設定をしないままコミットをしようとすると次のようにエラーとなります。
$ git checkout -b test-20241210
Switched to a new branch 'test-20241210'
$ touch hoge.txt
$ git add .
$ git commit -m "Test"
Author identity unknown
*** Please tell me who you are.
Run
git config --global user.email "you@example.com"
git config --global user.name "Your Name"
to set your account's default identity.
Omit --global to set the identity only in this repository.
fatal: empty ident name (for <cloudshell-user@ip-10-132-73-171.ap-northeast-1.compute.internal>) not allowed
git config
コマンドで開発者の情報を設定します。
$ git config --global user.email wakatsuki.ryuta@example.com
$ git config --global user.name "Ryuta Wakatsuki"
設定後であればコミットは行うことができました。またプッシュもできたので GitHub CLI で設定した認証情報が git
コマンドでも利用されていることが確認できました。
$ git commit -m "Test"
[test-20241210 0dadb0c] Test
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 hoge.txt
$ git push origin HEAD
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 2 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 275 bytes | 137.00 KiB/s, done.
Total 3 (delta 1), reused 1 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (1/1), completed with 1 local object.
remote:
remote: Create a pull request for 'test-20241210' on GitHub by visiting:
remote: https://github.com/classmethod-internal/icasu-cdk-serverless-api-sample/pull/new/test-20241210
remote:
To https://github.com/classmethod-internal/icasu-cdk-serverless-api-sample.git
* [new branch] HEAD -> test-20241210
gh コマンドは永続ストレージに保存されない
AWS CloudShell では $HOME
ディレクトリを 1GB の永続ストレージとして無料で利用可能です。それ以外のディレクトリはシェルセッションが終了すると削除されます。
$HOME
ディレクトリは既定では /home/cloudshell-user
となります。
$ echo $HOME
/home/cloudshell-user
そしてシェルセッションを再度開始後に確認すると、クローンしたリポジトリのディレクトリは残っていますが、gh コマンドは削除されてしまっています。
$ ls
icasu-cdk-serverless-api-sample
$ gh --version
bash: gh: command not found
GitHub の認証情報も削除されているので、リモートリポジトリにプッシュをしようとするとユーザー名とパスワードを求めらます。
$ git push origin HEAD
/usr/bin/gh auth git-credential get: line 1: /usr/bin/gh: No such file or directory
Username for 'https://github.com':
Password for 'https://github.com':
/usr/bin/gh auth git-credential erase: line 1: /usr/bin/gh: No such file or directory
remote: Repository not found.
GitHub CLI のインストール手順を再度実施します。
type -p yum-config-manager >/dev/null || sudo yum install yum-utils
sudo yum-config-manager --add-repo https://cli.github.com/packages/rpm/gh-cli.repo
sudo yum install gh
インストールできました。
$ which gh
/usr/bin/gh
$ gh --version
gh version 2.63.2 (2024-12-05)
https://github.com/cli/cli/releases/tag/v2.63.2
リモートリポジトリへのプッシュ操作も行うことができました。
$ git push origin HEAD
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Delta compression using up to 2 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 232 bytes | 232.00 KiB/s, done.
Total 2 (delta 1), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (1/1), completed with 1 local object.
To https://github.com/classmethod-internal/icasu-cdk-serverless-api-sample.git
0dadb0c..0ffc6bd HEAD -> test-20241210
逐一インストールするのは面倒かも知れませんが、一時的な作業環境であるという CloudShell の性質上、このような仕様は仕方ないのかもしれません。
参考
おわりに
AWS CloudShell 環境に GitHub CLI を導入する機会があったので方法をご紹介しました。
本記事がどなたかの参考になれば幸いです。
以上